package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.bean.Category;
import com.itheima.bean.Dish;
import com.itheima.bean.Setmeal;
import com.itheima.dao.CategoryDao;
import com.itheima.exception.CustomException;
import com.itheima.service.CategoryService;
import com.itheima.service.DishService;
import com.itheima.service.SetmealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional
public class CategoryServiceImpl extends ServiceImpl<CategoryDao , Category> implements CategoryService {


    @Lazy
    @Autowired
    private DishService dishService;
    @Lazy
    @Autowired
    private SetmealService setmealService;

    //@Autowired
    //private CategoryDao categoryDao;


    /**
     * 根据分类的id来删除分类
     *
     * @param id 分类的id
     * @return  0: 一行都删除不了，删除失败。 1 : 删除成功， -1 ： 有关联的菜品数据，禁止删除， -2： 有关联套餐数据，禁止删除
     */
    @Override
    public int remove(Long id) {

        //TODO:: 这里要去判定两张表，其实是多余，只需要判定一张表即可。
        // 如果我们在后台明确的知道前端要删除的是什么的分类： 是菜品分类，还是套餐分类的话，只需要去判断一张表即可
        // 如何才能知道到底执行的是什么分类的删除呢？ 就需要前端也把类型值传递过来！

        //1. 判定菜品表是否包含这种分类的数据
        LambdaQueryWrapper<Dish> dishQW = new LambdaQueryWrapper<>();
        dishQW.eq(Dish::getCategoryId, id);
        List<Dish> dishList = dishService.list(dishQW);

        //1.1 判断是否有菜品
        if(dishList != null && dishList.size() > 0 ){

            throw  new CustomException("该分类有关联的菜品数据，禁止删除！");
            //return -1;
        }

        //2. 判定套餐表是否包含这种分类的数据
        LambdaQueryWrapper<Setmeal> setmealQW = new LambdaQueryWrapper<>();
        setmealQW.eq(Setmeal::getCategoryId , id);
        List<Setmeal> setmealList = setmealService.list(setmealQW);

        //2.1 判断是否有套餐
        if(setmealList != null && setmealList.size() > 0 ){
            throw  new CustomException("该分类有关联的套餐数据，禁止删除！");
            //return -2;
        }

        //3. 直接删除 : 0 | 1
        int row = getBaseMapper().deleteById(id);

        return row;
    }
}
